package com.genius.service.impl;

import cn.hutool.core.util.IdUtil;
import com.genius.enums.ResponseType;
import com.genius.exception.GraceException;
import com.genius.mapper.NoticeUserMapper;
import com.genius.service.NoticeUserService;
import com.genius.system.dto.NoticeUserDTO;
import com.genius.system.pojo.NoticeUser;
import com.genius.utils.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;

@Service
public class NoticeUserServiceImpl implements NoticeUserService {

    @Autowired
    private NoticeUserMapper noticeUserMapper;

    @Override
    public List<NoticeUserDTO> selectNoticeUserByPage(NoticeUser noticeUser) {
        return noticeUserMapper.selectNoticeUserByPage(noticeUser);
    }

    @Override
    public int selectNoticeCountByUserId(Long userId) {
        return noticeUserMapper.selectNoticeCountByUserId(userId);
    }

    @Override
    @Transactional
    public int insertNoticeUser(Long noticeId, Long[] userIds) {
        List<NoticeUser> noticeUserList = new ArrayList<>();
        for(Long userId: userIds){
            NoticeUser noticeUser = new NoticeUser();
            Long noticeUserId = IdUtil.getSnowflake().nextId();
            noticeUser.setNoticeUserId(noticeUserId);
            noticeUser.setNoticeId(noticeId);
            noticeUser.setUserId(userId);
            boolean isExist = noticeUserMapper.selectNoticeUserIsExist(noticeUser);
            if(!isExist){
                noticeUser.setStatus("0");
                noticeUser.setCreateBy(SecurityUtils.getUsername());
                noticeUserList.add(noticeUser);
            }
        }
        if(noticeUserList.isEmpty()){
            return 0;
        }
        return noticeUserMapper.insertNoticeUser(noticeUserList);
    }

    @Override
    @Transactional
    public int revokeNoticeUserByIds(Long[] ids) {
        if(noticeUserMapper.noticeCanRevokeOrNot(ids)){
            GraceException.display(ResponseType.REVOKE_NOTICE_ERROR);
        }
        return noticeUserMapper.revokeNoticeUserByIds(ids);
    }

    @Override
    @Transactional
    public int readNoticeUserByIds(Long[] ids) {
        // 判断是否为当前用户的消息
        Long userId = SecurityUtils.getUserId();
        for(Long id : ids){
            NoticeUser noticeUser = new NoticeUser();
            noticeUser.setNoticeUserId(id);
            noticeUser.setUserId(userId);
            if(!noticeUserMapper.noticeCanReadOrNot(noticeUser)){
                GraceException.display(ResponseType.READ_NOTICE_ERROR);
            }
        }
        return noticeUserMapper.readNoticeUserByIds(ids);
    }

    @Override
    @Transactional
    public int deleteNoticeUserByIds(Long[] ids) {
        if(noticeUserMapper.noticeCanRevokeOrNot(ids)){
            GraceException.display(ResponseType.DELETE_NOTICE_ERROR);
        }
        return noticeUserMapper.deleteNoticeUserByIds(ids);
    }
}
